package br.com.ordersys.web.client.modules.utils;

import com.google.gwt.core.client.Scheduler;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;

public class UIUtils {
	/**
	 * Aplica um conjunto de estilos CSS em um Widget
	 * @param w widget
	 * @param style lista de estilos CSS separados por ';'. O nome do atributo não pode possuir hifen
	 */
	public static void setWidgetStyle(Widget w, String style){
		setStyle(w.getElement().getStyle(), style);
	}
	
	
	public static void setStyle(Style uiStyle, String style){
		String[] v = style.split(";");
		
		for(String s : v){
			String[] vp = s.split(":");
			uiStyle.setProperty(vp[0].trim(), vp[1].trim());
		}
	}

	/**
	 * Obtem o valor de um elemento da DOM
	 * @param id ID do elemento
	 * @return
	 */
	public static String getEnvironment(String id){
		Element elem = DOM.getElementById(id);

		return elem != null ? elem.getAttribute("value") : null;
	}
	
	/**
	 * Aplica estilo CSS ao parent de um Widget
	 * @param w
	 * @param style
	 */
	public static void setParentStyle(Widget w, String style){
		Element p = w.getElement().getParentElement();
		
		setStyle(p.getStyle(), style);
	}
	
	/**
	 * Procura um elemento na estrutura de 'parents' de um elemento utilizando um filtro
	 * @param w widget base para a busca
	 * @param f filtro que será executado em cada elemento
	 * 
	 * @return
	 */
	public static Element findElement(Widget w, ElementFilter f){
		Element p = w.getElement().getParentElement();
		
		while(p != null){
			if(f.acept(p)){
				return p;
			}
			
			p = p.getParentElement();
		}
		
		return null;
	}
	
	/**
	 * Interface para filtrar elementos em uma busca na DOM
	 * @author Cláudio Gualberto
	 * 26/06/2013
	 *
	 */
	public static interface ElementFilter{
		boolean acept(Element e);
	}
	
	/**
	 * Monta um elemento vazio util na configuração de paineis para separação entre widgets
	 * @param width
	 * @param height
	 * @return
	 */
	public static Panel buildEmptySpace(String width, String height){
		Panel p = new SimplePanel();
		p.setWidth(width);
		p.setHeight(height);
		return p;
	}
	
	public static void addClickHandler(Widget w, ClickHandler hnd){
		w.addDomHandler(hnd,  ClickEvent.getType());
	}
	
	public static void callLater(final Runnable r){
		Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
			
			@Override
			public void execute() {
				r.run();
			}
		});
	}
	
	/**
	 * Monta um URI base da aplicação. Necessário em páginas que foram carregadas com URLs do tipo REST e portanto não podemos usar uma path relativa simples.
	 * Não tentamos montar um URL completo (host, porta,etc), mas sim apenas a parte da PATH
	 * 
	 * @param resourcePath
	 * 
	 * @return
	 */
	public static String buildAppBaseURI(String resourcePath){
		String path = Window.Location.getPath(); // consideramos que a path tem o padrão appContext/tenantID
		
		int firstSlashIdx = path.indexOf('/', 1);
		int secondSlashIdx = path.indexOf('/', firstSlashIdx+1);
		
		return path.substring(0,secondSlashIdx + 1) + resourcePath;
	}
}
